import router from '@/router'
import NProgress from 'nprogress'
import useUserStore from '@/store/modules/user.ts'

NProgress.configure({ showSpinner: false }) //设置进度条没有加载的小圈
//全局前置守卫：初始化时执行、每次路由切换前执行
router.beforeEach(async (to, _from, next) => {
  const userStore = useUserStore()
  NProgress.start()
  // 路由鉴权
  if (!userStore.token) {
    // 1.如果未登录（token），需要判断to的path，如果不是登录路由，则携带redirect重定向登录，如果是登录，直接放行
    if (to.path !== '/login') {
      next({
        path: '/login',
        query: { redirect: to.path },
      })
    } else {
      next()
    }
  } else {
    // 2.如果已登录，需要判断to的path，如果是登录路由，需重定向到/home，如果不是登录，需要判断当前用户信息是否已存在，不存在则需要重新获取
    if (to.path === '/login') {
      next({ path: '/home' })
    } else {
      if (userStore.userInfo.name) {
        next()
      } else {
        try {
          await userStore.getUserInfo()
          next({ ...to, replace: true })
        } catch (e) {
          // token失效，无法获取用户信息,重新登录
          await userStore.logout()
          next({
            path: '/login',
            query: { redirect: to.path },
          })
        }
      }
    }
  }
})

//全局后置守卫：初始化时执行、每次路由切换后执行
router.afterEach((to) => {
  document.title = to.meta.title as string //页签标题随着路由改变
  NProgress.done()
})

//第一个问题:任意路由切换实现进度条业务 ---nprogress
//第二个问题:路由鉴权(路由组件访问权限的设置)
//全部路由组件:登录|404|任意路由|首页|数据大屏|权限管理(三个子路由)|商品管理(四个子路由)

//用户未登录:可以访问login,其余六个路由不能访问(指向login)
//用户登录成功:不可以访问login[指向首页],其余的路由可以访问
